package com.code.javaconcurrent.memoizer;// package com.code.javaconcurrent.memoizer;
//
// import java.util.Map;
// import java.util.Random;
// import java.util.concurrent.*;
//
// /**
//  * @author codeDorado
//  * @version 1.0
//  * @date 2020/7/15 17:20
//  */
// public class Memoizer<String, V> implements Computable {
//
//
//     private final Map<String, Future<V>> cache = new ConcurrentHashMap<>();
//     private final Computable<String, V> c;
//
//     public Memoizer(Computable<String, V> c) {
//         this.c = c;
//     }
//
//     /**
//      * 实现缓存的机制
//      *
//      * @param arg 需要计算的值
//      * @return 计算后的结果
//      * @throws InterruptedException 线程中断异常
//      */
//     @Override
//     public V compute(final Object arg) throws InterruptedException {
//         Future<V> future = cache.get(arg);
//         if (future == null) {
//             Callable<V> eval = new Callable<V>() {
//                 @Override
//                 public V call() throws Exception {
//                     return c.compute(arg);
//                 }
//             };
//             FutureTask<V> task = new FutureTask<>(eval);
//             future = cache.putIfAbsent(arg, task);
//             if (future == null) {
//                 future = task;
//                 task.run();
//             }
//             try {
//                 return future.get();
//             } catch (ExecutionException e) {
//                 e.printStackTrace();
//             }
//         }
//         return null;
//     }
// }
